This is the analysis of immune populations and subpopulations in the BM of 16 NSG mice that have been humanized with CD34+ human stem cells (HSC), derived from cord blood immunoseparation.
Mice were injected with MM cell line MM1S-luc at week 12 after humanization, and at week 15 they were split into 4 groups: vehicle (PBS), daratumumab 4mg/kg (intraperitoneal injection, each week), belantamab mafotdotin 1mg/kg (intraperitoneal injection, 2 times a week), and its combination.
MM1S-luc bioluminescence was monitored twice a week throught the experiment using an IVIS bioluminescent imager
Peripheral blood immune populations were monitored periodically via spectral flow cytometry (FCM, using a Cytek Aurora flow cytometer), and after 20 weeks of humanization (5 of treatment) mice were sacrificed and BM was extracted and analyzed via spectral FCM, using the following panel:
| BUV395 | BUV737 | PacB | BV480 | BV605 | BV711 | BV786 | RB780 | PE Fire700 | PE Cy5 | PE Fire810 | AF700 | APC Vio770 | PE Cy7 | PE | PE CF594 | APC | PerCP |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CD14 | CD19 | CD16 | CD8 | CD4 | CD127 | CD3 | CD69 | CD25 | CD33 | HLA DR | huCD45 | CD56 | TCRgd | CD64 | CD34 | CD117 | CD45m |
Data was analyzed by Servicio de Citometría de Nucleus (Universidad de Salamanca), specifically by Dr. C. Teodosio and J. Pozo, using Infinicyt 2.0 software.
Populations were expressed as a subpopulation within another one. For
instance, T cells were gates as follows:
Nucleated cells \> Human cells (CD45hu+, CD45m-) \> Lymphocytes \> T cells (CD3+)
Populations (and subpopulations) are seen as a tree-like structure. In our particular case, our population tree is defined as:
We need to load some libraries beforehand, and define a color palette
library(ggrepel)
library(ggsignif)
library(rstatix)
library(highcharter)
palette <- c("#8BADB3", "#A64D79", "#674EA7", "#234A6B",
'#FFB347', "#89C586", "#F26D6D", "#6D75F2","#ECC76A")
order <- c('CTRL', 'BELA', 'DARA', 'BELADARA')
FCS subpopulation data was exported on a dataframe and we used the
variable % from a higher hierarchical level as a plotting
function.
library(dplyr)
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
df <- readxl::read_xlsx('20240409_Mauro L12_resultados MO_ratones humanizados.xlsx')
df$id <- (gsub('.*?(\\d+\\.\\d+).*', '\\1', df$File))
df <- df %>% relocate(id, .after = File)
df$group <- gsub('.*?(CTRL|BELA|DARA|BELADARA).*', '\\1', df$File)
df <- df %>% relocate(group, .after = id)
df$`% from higher hierarchical level` <- as.numeric(df$`% from higher hierarchical level`)
We have to eliminate mice number 5.33 and 4.33 as they are a outliers on our Bioluminiscent Imaging data (data not shown).
df <- subset(df, id!= '5.33')
df <- subset(df, id!= '4.33')
df <- na.omit(df)
colnames(df)[which(names(df) == "% from higher hierarchical level")] <- "pop_perc"
df$group <- factor(df$group)
head(df)
## # A tibble: 6 x 90
## Population File id group Subpopulation Events `% from total events`
## <chr> <chr> <chr> <fct> <chr> <dbl> <dbl>
## 1 Debris/ Doublets~ Sema~ 2.0 CTRL EVENTS 232133 23.2
## 2 Debris/ Doublets~ Sema~ 2.1 CTRL EVENTS 198330 19.9
## 3 Debris/ Doublets~ Sema~ 2.10 CTRL EVENTS 221487 22.1
## 4 Debris/ Doublets~ Sema~ 2.11 CTRL EVENTS 274886 27.5
## 5 Debris/ Doublets~ Sema~ 3.1 BELA EVENTS 205137 20.5
## 6 Debris/ Doublets~ Sema~ 3.10 BELA EVENTS 247873 25
## # i 83 more variables: `% from nucleated cells` <chr>,
## # `% from Human nucleated cells (excluding erythroblasts)` <chr>,
## # pop_perc <dbl>, `Mean - SSC-A` <chr>, `Mean - FSC-A` <chr>,
## # `Mean - CD14:BUV395-A` <chr>, `Mean - CD19:BUV737-A` <chr>,
## # `Mean - CD16:Pacific Blue-A` <chr>, `Mean - CD8:BV480-A` <chr>,
## # `Mean - CD4:BV605-A` <chr>, `Mean - CD127:BV711-A` <chr>,
## # `Mean - CD3:BV786-A` <chr>, `Mean - CD45m:PerCP-Cy5.5-A` <chr>, ...
Define our function to plot our data in a stacked bar chart, using
highcharter’s hchart function. First we need
to make two helper functions, one to extract subpopulations which are
direct children of our gigantic dataset, and make a dataframe of
frequencies, grouped by experimental group and major population.
getSummaryDf <- function(subpopulation){
df_filtered <- df %>%
filter(Subpopulation == subpopulation)
df_summary <- df_filtered %>%
group_by(group, Population) %>%
summarise(mean_frequency = mean(pop_perc),
.groups='drop') %>%
ungroup()
return(df_summary)
}
plotStackedBar <- function(subpopulation = 'Human Cells'){
df_summary <- getSummaryDf(subpopulation)
df_summary$group <- factor(df_summary$group, levels = c('CTRL','BELA', 'DARA','BELADARA'), labels=c('Control', 'Belantamab','Daratumumab','Combo'))
plot <- df_summary %>%
hchart(
'column',
hcaes(x = group, y = mean_frequency, group = Population),
stacking = "normal"
) %>%
hc_yAxis(
title = list(text = "Mean Frequency (%)", style = list( fontSize = 16)),
max = 100
) %>%
hc_xAxis(
title = list(text='Experimental Group', style = list( fontSize = 16)),
categories = order
) %>%
hc_title(
text = paste0(subpopulation, ' subpopulation distribution'),
margin = 20,
align = "left"
)
return(plot)
}
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.1.3
getGGStacked <- function(x){
palette <- c(
'#7CB5EC','#434348', '#90ED7D', '#F7A35C',"#8085E9","#F15C80","#E4D354","#2B908F",'#f45b5b')
df_summary <- getSummaryDf(x)
df_summary$group <- factor(df_summary$group, levels = c('CTRL','BELA', 'DARA','BELADARA'), labels=c('Control', 'Belantamab','Daratumumab','Combo'))
p <- ggplot(df_summary, aes(x = group, y = mean_frequency, fill = Population)) + geom_bar(position="stack", stat="identity") + theme_bw() + scale_fill_manual(values=palette) + labs(
x = "Treatment group",
title=paste0(x, ' subpopulation distribution'),
y = "Mean Frequency(%)",
color = "Immune population"
) +
theme_minimal()+
theme(
legend.position='bottom',
plot.title =element_text(size=10, face='bold', hjust=0.5),
axis.text=element_text(size=12),
axis.title=element_text(size=10),
legend.text=element_text(size=8),
legend.key.size = unit(0.5, 'line')) +guides(fill=guide_legend(nrow=3,byrow=TRUE))
return(p)
}
p<- plotStackedBar()
htmltools::tagList(p)
From the rest of the data we can extract the subpopulations in a tree-like structure. For a given subpopulation on the main branch
subp_vector <- unique(df$Subpopulation)
subp_vector <- subp_vector[!subp_vector %in% c('EVENTS', 'Human Cells')]
a = list()
for (pop in subp_vector) {
a[[pop]] <- plotStackedBar(pop)
}
htmltools::tagList(a)
#major <- plotStackedBar()
#lymphs_plot <- plotStackedBar('Lymphocytes')
#t_plot <- plotStackedBar('T-Cells')
#plot_list <- list(major, lymphs_plot, t_plot)
#plots <- hw_grid(plot_list, ncol=1)
#htmltools::tagList(plots)
#htmlwidgets::saveWidget(widget = major, file = "major.html")
#getwd()
#webshot(url = "major.html",
# file = "major.svg",
# delay=6)